home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1998 #1 / Amiga Plus 1998 #1.iso / demo-versionen / haage&partner / warpup-warpos / warprace / modsrc / c2p.s < prev   
Text File  |  1997-09-24  |  15KB  |  476 lines

  1.                 incdir  include:
  2.                 incdir  lvo:
  3.                 incdir  powerasm:source/powerpc_lib/warprace/
  4.  
  5. **      '(C) Copyright 1997 Haage & Partner Computer GmbH'
  6. **           All Rights Reserved
  7.  
  8.                 include powerpc/powerpc.i
  9.                 include warprace.i
  10.  
  11.                 include exec/memory.i
  12.                 include graphics/gfx.i
  13.  
  14.                 include exec_lib.i
  15.                 include graphics_lib.i
  16.  
  17.                 xref    _LinkerDB
  18.                 xref    C2P_PPC
  19.  
  20.                 xdef    bitmap
  21.                 xdef    ChunkyBuffer
  22.  
  23. VERSION         =       1
  24. REVISION        =       0
  25. REVISIONCOUNT   =       1
  26.  
  27. merge           macro
  28.                 move.l  \2,\4
  29.                 move.l  #\5,\3
  30.                 and.l   \3,\2
  31.                 and.l   \1,\3
  32.                 eor.l   \3,\1
  33.                 eor.l   \2,\4
  34.                 ifeq    \6-1
  35.                 add.l   \3,\3
  36.                 else
  37.                 lsl.l   #\6,\3
  38.                 endc
  39.                 lsr.l   #\6,\4
  40.                 or.l    \3,\2
  41.                 or.l    \4,\1
  42.                 endm
  43.  
  44.  
  45.  
  46.  
  47.                 section "",code
  48.  
  49.                 mc68020
  50.  
  51. start
  52.                 movem.l d1-a6,-(sp)
  53.                 lea     _LinkerDB,a4
  54.                 cmp.l   #WR_ID,d0
  55.                 beq.b   .go
  56.                 movem.l (sp)+,d1-a6
  57.                 moveq   #0,d0
  58.                 rts
  59. .go
  60.                 lea     ErrParams,a3
  61.                 move.l  a0,a2
  62.                 move.l  $4.w,_SysBase
  63.                 lea     graf_name,a1
  64.                 move.l  a1,(a3)
  65.                 moveq   #0,d0
  66.                 move.l  d0,4(a3)
  67.                 lea     LibErr,a5
  68.                 CALLEXEC        OpenLibrary
  69.                 move.l  d0,_GfxBase
  70.                 beq.b   .error
  71.                 move.l  #320*256,d0
  72.                 move.l  d0,(a3)
  73.                 move.l  #MEMF_PUBLIC,d1
  74.                 lea     MemErr,a5
  75.                 CALLEXEC        AllocVec
  76.                 move.l  d0,ChunkyBuffer
  77.                 beq.b   .error
  78.                 lea     ChipErr,a5
  79.                 bsr     SetupBitmaps
  80.                 tst.l   d0
  81.                 beq.b   .error
  82.                 move.l  WRI_POWERPCBASE(a2),_PowerPCBase
  83.                 tst     WRI_68K(a2)
  84.                 bne     .notPPC
  85.                 move.l  a2,a0
  86.                 RUNPOWERPC      C2P_PPC
  87.                 bra.w   .done
  88. .notPPC
  89.                 move.l  WRI_STARTTIMER_68K(a2),a1
  90.                 jsr     (a1)
  91.                 moveq   #50-1,d7
  92. .loop
  93.                 move.l  ChunkyBuffer,a0
  94.                 lea     bitmap,a1
  95.                 bsr     ChunkyToPlanar
  96.                 dbra    d7,.loop
  97.                 move.l  WRI_STOPTIMER_68K(a2),a1
  98.                 jsr     (a1)
  99.                 divu.l  #50,d0
  100. .done
  101.                 move.l  d0,Result
  102.                 divul.l #1000,d1:d0
  103.                 move.l  d0,ResultParams
  104.                 move.l  d1,ResultParams+4
  105.                 move.l  #STATUS_SUCCESS,Status
  106.                 bra.b   .end
  107. .error
  108.                 move.l  #STATUS_ERROR,Status
  109.                 move.l  a5,ErrStr
  110. .end
  111.                 move.l  ChunkyBuffer,d0
  112.                 beq.b   .nofree
  113.                 move.l  d0,a1
  114.                 CALLEXEC        FreeVec
  115. .nofree
  116.                 bsr     FreeBitmaps
  117.                 move.l  _GfxBase,d0
  118.                 beq.b   .nograf
  119.                 move.l  d0,a1
  120.                 CALLEXEC        CloseLibrary
  121. .nograf
  122.                 move.l  #WRO,d0
  123.                 movem.l (sp)+,d1-a6
  124.                 rts
  125.  
  126. ******************************************************************************
  127. *
  128. *       d0 = SetupBitmaps
  129. *
  130. *       prepares one bitmap
  131. *
  132. *       Out:
  133. *       d0 = error code
  134. *
  135. *       error codes:    -1 = success
  136. *                        0 = not enough memory
  137. ******************************************************************************
  138. SetupBitmaps
  139.                 movem.l d1/d5-a2,-(sp)
  140.                 lea     bitmap,a0
  141.                 move.l  a0,ActualBitmap
  142. .loop
  143.                 move.l  a0,a2
  144.                 lea     bm_Planes(a2),a2        ;a2 -> planeptrs
  145.                 moveq   #8,d0
  146.                 move.l  #320,d1
  147.                 move.l  #256,d2
  148.                 CALLGRAF        InitBitMap      ;init bitmap structures
  149.                 move.l  #320,d0
  150.                 move.l  #256*8,d1
  151.                 CALLGRAF        AllocRaster     ;allocate bitmap memory
  152.                 tst.l   d0
  153.                 beq.b   .error
  154.                 move.l  d0,a0
  155.                 move.l  #(256*8*320/8/4),d5
  156. .clear
  157.                 clr.l   (a0)+                   ;clear one plane
  158.                 subq.l  #1,d5
  159.                 bne.b   .clear
  160.                 moveq   #8-1,d6
  161. .loop2
  162.                 move.l  d0,(a2)+                ;and insert into bitmap struct
  163.                 add.l   #320/8*256,d0
  164.                 dbra    d6,.loop2
  165.                 moveq   #-1,d0
  166.                 bra.b   .end
  167. .error
  168.                 moveq   #0,d0
  169. .end
  170.                 movem.l (sp)+,d1/d5-a2
  171.                 rts
  172.  
  173. ******************************************************************************
  174. *
  175. *       FreeBitmaps
  176. *
  177. *       frees all the memory allocated by 'AllocRaster'
  178. *
  179. ******************************************************************************
  180. FreeBitmaps
  181.                 movem.l d0/d1/d6-a2,-(sp)
  182.                 lea     bitmap,a0
  183. .loop
  184.                 move.l  a0,a2
  185.                 lea     bm_Planes(a2),a2
  186.                 moveq   #8-1,d6
  187. .loop2
  188.                 move.l  (a2)+,d0                ;read planeptr
  189.                 beq.b   .next
  190.                 move.l  d0,a0
  191.                 move.l  #320,d0
  192.                 move.l  #256,d1
  193.                 CALLGRAF        FreeRaster      ;free the bitmap memory
  194. .next
  195.                 dbra    d6,.loop2
  196.                 movem.l (sp)+,d0/d1/d6-a2
  197.                 rts
  198.  
  199. ******************************************************************************
  200. *
  201. *       ChunkyToPlanar (a0,a1)
  202. *
  203. *       converts chunky data into bitplane data (using Bitmap Structure)
  204. *       works ONLY with a depth of 8 and resolution 320*256.
  205. *       the 8 bitplanes MUST have been allocated in ONE piece!!
  206. *
  207. *       original algorithm by James McCoull (I found the source somewhere
  208. *       on the AMINET CD's)
  209. *
  210. *       In: a0 -> Chunkybuffer
  211. *           a1 -> Bitmap structure
  212. *
  213. ******************************************************************************
  214. ChunkyToPlanar
  215.                 movem.l d0-a6,-(sp)
  216.                 sub.w   #40,sp          ; space for temporary variables
  217.  
  218.                 move.l  #256*40,d2
  219.                 move.l  bm_Planes(a1),a1
  220.  
  221. ; a0 = chunky buffer
  222. ; a1 = output area
  223. ; d2 = plsiz
  224.                 ext.l   d2
  225.                 movea.l d2,a3           ; a3 = plsiz
  226.                 move.l  a0,a4
  227.                 add.l   #320*256,a4     ; a4 -> end of chunky data
  228.  
  229.  
  230. first_case
  231.                 move.l  (0,a0),d1
  232.                 move.l  (4,a0),d3
  233.                 move.l  (8,a0),d0
  234.                 move.l  (12,a0),d2
  235.                 move.l  (2,a0),d4
  236.                 move.l  (10,a0),d5
  237.                 move.l  (6,a0),d6
  238.                 move.l  (14,a0),d7
  239.  
  240.                 move.w  (16,a0),d1
  241.                 move.w  (24,a0),d0
  242.                 move.w  (20,a0),d3
  243.                 move.w  (28,a0),d2
  244.                 move.w  (18,a0),d4
  245.                 move.w  (26,a0),d5
  246.                 move.w  (22,a0),d6
  247.                 move.w  (30,a0),d7
  248.  
  249.                 adda.w  #32,a0
  250.  
  251.                 move.l  d6,a5
  252.                 move.l  d7,a6
  253.  
  254.                 merge   d1,d0,d6,d7,$00ff00ff,8
  255.                 merge   d3,d2,d6,d7,$00ff00ff,8
  256.  
  257.                 merge   d1,d3,d6,d7,$0f0f0f0f,4
  258.                 merge   d0,d2,d6,d7,$0f0f0f0f,4
  259.  
  260.                 exg     d1,a5
  261.                 exg     d0,a6
  262.  
  263.                 merge   d4,d5,d6,d7,$00ff00ff,8
  264.                 merge   d1,d0,d6,d7,$00ff00ff,8
  265.  
  266.                 merge   d4,d1,d6,d7,$0f0f0f0f,4
  267.                 merge   d5,d0,d6,d7,$0f0f0f0f,4
  268.  
  269.                 merge   d3,d1,d6,d7,$33333333,2
  270.                 merge   d2,d0,d6,d7,$33333333,2
  271.  
  272.                 merge   d3,d2,d6,d7,$55555555,1
  273.                 merge   d1,d0,d6,d7,$55555555,1
  274.  
  275.                 move.l  d0,(0*4,sp)             ;plane0
  276.                 move.l  d1,(1*4,sp)             ;plane1
  277.                 move.l  d2,(2*4,sp)             ;plane2
  278.                 move.l  d3,(3*4,sp)             ;plane3
  279.  
  280.                 move.l  a5,d3
  281.                 move.l  a6,d2
  282.  
  283.                 merge   d3,d4,d6,d7,$33333333,2
  284.                 merge   d2,d5,d6,d7,$33333333,2
  285.  
  286.                 merge   d3,d2,d6,d7,$55555555,1
  287.                 merge   d4,d5,d6,d7,$55555555,1
  288.  
  289.                 move.l  d5,(4*4,sp)             ;plane4
  290.                 move.l  d4,(5*4,sp)             ;plane5
  291.  
  292.                 move.l  d2,(6*4,sp)             ;plane6
  293.                 move.l  d3,(7*4,sp)             ;plane7
  294.  
  295.                 move.l  a1,(32,sp)              ; save output address
  296.                 addq.l  #4,a1                   ; skip 32 pixels on output
  297.  
  298.                 cmpa.l  a0,a4
  299.                 beq.w   final_case
  300.  
  301.  
  302.  
  303. main_case
  304.                 move.l  a1,(36,sp)      ; save current output address
  305.                 move.l  (32,sp),a1      ; a1 = previous output address
  306.  
  307.                 move.l  (0,a0),d1
  308.                 move.l  (4,a0),d3
  309.                 move.l  (8,a0),d0
  310.                 move.l  (12,a0),d2
  311.                 move.l  (2,a0),d4
  312.                 move.l  (10,a0),d5
  313.                 move.l  (6,a0),d6
  314.                 move.l  (14,a0),d7
  315.  
  316.                 move.w  (16,a0),d1
  317.                 move.w  (24,a0),d0
  318.                 move.w  (20,a0),d3
  319.                 move.w  (28,a0),d2
  320.                 move.w  (18,a0),d4
  321.                 move.w  (26,a0),d5
  322.                 move.w  (22,a0),d6
  323.                 move.w  (30,a0),d7
  324.  
  325.                 adda.w  #32,a0
  326.  
  327.                 move.l  d6,a5
  328.                 move.l  d7,a6
  329.  
  330.                 move.l  (0*4,sp),(a1)           ;plane0
  331.                 adda.l  a3,a1                   ;a1+=plsiz
  332.  
  333.                 merge   d1,d0,d6,d7,$00ff00ff,8
  334.                 merge   d3,d2,d6,d7,$00ff00ff,8
  335.  
  336.                 move.l  (1*4,sp),(a1)           ;plane1
  337.                 adda.l  a3,a1                   ;a1+=plsiz
  338.  
  339.                 merge   d1,d3,d6,d7,$0f0f0f0f,4
  340.                 merge   d0,d2,d6,d7,$0f0f0f0f,4
  341.  
  342.                 exg     d1,a5
  343.                 exg     d0,a6
  344.  
  345.                 move.l  (2*4,sp),(a1)           ;plane2
  346.                 adda.l  a3,a1                   ;a1+=plsiz
  347.  
  348.                 merge   d4,d5,d6,d7,$00ff00ff,8
  349.                 merge   d1,d0,d6,d7,$00ff00ff,8
  350.  
  351.                 move.l  (3*4,sp),(a1)           ;plane3
  352.                 adda.l  a3,a1                   ;a1+=plsiz
  353.  
  354.                 merge   d4,d1,d6,d7,$0f0f0f0f,4
  355.                 merge   d5,d0,d6,d7,$0f0f0f0f,4
  356.  
  357.                 move.l  (4*4,sp),(a1)           ;plane4
  358.                 adda.l  a3,a1                   ;a1+=plsiz
  359.  
  360.                 merge   d3,d1,d6,d7,$33333333,2
  361.                 merge   d2,d0,d6,d7,$33333333,2
  362.  
  363.                 move.l  (5*4,sp),(a1)           ;plane5
  364.                 adda.l  a3,a1                   ;a1+=plsiz
  365.  
  366.                 merge   d3,d2,d6,d7,$55555555,1
  367.                 merge   d1,d0,d6,d7,$55555555,1
  368.  
  369.                 move.l  d0,(0*4,sp)             ;plane0 (movem.l is slower!)
  370.                 move.l  d1,(1*4,sp)             ;plane1
  371.                 move.l  d2,(2*4,sp)             ;plane2
  372.                 move.l  d3,(3*4,sp)             ;plane3
  373.  
  374.                 move.l  a5,d3
  375.                 move.l  a6,d2
  376.  
  377.                 move.l  (6*4,sp),(a1)           ;plane6
  378.                 adda.l  a3,a1                   ;a1+=plsiz
  379.  
  380.                 merge   d3,d4,d6,d7,$33333333,2
  381.                 merge   d2,d5,d6,d7,$33333333,2
  382.  
  383.                 move.l  (7*4,sp),(a1)           ;plane7
  384.                 adda.l  a3,a1                   ;a1+=plsiz
  385.  
  386.                 merge   d3,d2,d6,d7,$55555555,1
  387.                 merge   d4,d5,d6,d7,$55555555,1
  388.  
  389.                 move.l  d5,(4*4,sp)             ;plane4
  390.                 move.l  d4,(5*4,sp)             ;plane5
  391.  
  392.                 move.l  d2,(6*4,sp)             ;plane6
  393.                 move.l  d3,(7*4,sp)             ;plane7
  394.  
  395.                 movea.l (36,sp),a1      ; restore current output address
  396.                 move.l  a1,(32,sp)      ; save output address
  397.                 addq.l  #4,a1
  398.  
  399.                 cmpa.l  a0,a4
  400.                 bne.w   main_case
  401.  
  402.  
  403. final_case
  404.                 move.l  (32,sp),a1      ; a1 = previous output address
  405.  
  406.                 move.l  (0*4,sp),(a1)           ;plane0
  407.                 adda.l  a3,a1                   ;a1+=plsiz
  408.                 move.l  (1*4,sp),(a1)           ;plane1
  409.                 adda.l  a3,a1                   ;a1+=plsiz
  410.                 move.l  (2*4,sp),(a1)           ;plane2
  411.                 adda.l  a3,a1                   ;a1+=plsiz
  412.                 move.l  (3*4,sp),(a1)           ;plane3
  413.                 adda.l  a3,a1                   ;a1+=plsiz
  414.                 move.l  (4*4,sp),(a1)           ;plane4
  415.                 adda.l  a3,a1                   ;a1+=plsiz
  416.                 move.l  (5*4,sp),(a1)           ;plane5
  417.                 adda.l  a3,a1                   ;a1+=plsiz
  418.                 move.l  (6*4,sp),(a1)           ;plane6
  419.                 adda.l  a3,a1                   ;a1+=plsiz
  420.                 move.l  (7*4,sp),(a1)           ;plane7
  421.  
  422. exit
  423.                 add.w   #40,sp
  424.                 movem.l (sp)+,d0-a6
  425.                 rts
  426.  
  427.  
  428.  
  429.                 section "",data
  430.  
  431. graf_name       GRAFNAME
  432.                 cnop    0,4
  433.  
  434. WRO
  435.                 dc.l    ModName
  436.                 dc.l    Short
  437.                 dc.l    Description
  438.                 dc.l    Author
  439.                 dc.l    VERSION
  440.                 dc.l    REVISION
  441.                 dc.l    REVISIONCOUNT
  442.                 dc.l    0
  443. Result
  444.                 dc.l    0
  445.                 dc.l    RES_MICROSECS
  446.                 dc.l    ResultString
  447.                 dc.l    ResultParams
  448. Status
  449.                 dc.l    0
  450. ErrStr
  451.                 dc.l    0
  452.                 dc.l    ErrParams
  453.                 dc.l    0
  454.  
  455. ModName         dc.b    "C2P",0
  456. Short           dc.b    "ChunkyToPlanar converter (320*256*8)",0
  457. Description     dc.b    "This program measures the time for a ChunkyToPlanar-\n"
  458.                 dc.b    "conversion to complete. The dimensions are 320*256*8.",0
  459. Author          dc.b    "Sam Jordan (original C2P algorithm by James Mc Coull)",0
  460. ResultString    dc.b    "Elapsed time: %ld.%03ld ms",0
  461.  
  462. LibErr          dc.b    "Failed to open %s V%ld",0
  463. MemErr          dc.b    "Failed to allocate %ld bytes or memory",0
  464. ChipErr         dc.b    "Failed to allocate 320*256 bytes of CHIP memory",0
  465.  
  466.                 section "",bss
  467.  
  468. _SysBase        ds.l    1
  469. _GfxBase        ds.l    1
  470. _PowerPCBase    ds.l    1
  471. ActualBitmap    ds.l    1
  472. ChunkyBuffer    ds.l    1
  473. ResultParams    ds.l    2
  474. ErrParams       ds.l    2
  475. bitmap          ds.b    bm_SIZEOF
  476.